home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / include / netUltra.h < prev    next >
C/C++ Source or Header  |  1992-08-05  |  4KB  |  126 lines

  1. /*
  2.  * netUltra.h --
  3.  *
  4.  *    Definitions for sending and receiving Ultranet packets.  Packets
  5.  *    are sent by putting a "Net_UltraHeader" at the start of the packet
  6.  *    then doing a write() on the Ultranet device.  Packets are read
  7.  *    by doing a read.
  8.  *
  9.  * Copyright 1990 Regents of the University of California
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that the above copyright
  13.  * notice appear in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  *
  18.  * $Header: /sprite/src/lib/include/RCS/netUltra.h,v 1.5 92/08/05 16:34:54 jhh Exp $ SPRITE (Berkeley)
  19.  */
  20.  
  21. #ifndef _NETULTRA
  22. #define _NETULTRA
  23.  
  24. #include "sprite.h"
  25. #include "machparam.h"
  26.  
  27. /*
  28.  * The following macros are used to manipulate an Ultranet address.
  29.  */
  30.  
  31. #define Net_UltraAddressSet(addrPtr, group, unit) {         \
  32.     ((unsigned char *) (addrPtr))[4] = (group) >> 2;         \
  33.     ((unsigned char *) (addrPtr))[5] = ((group) << 6) | (unit); \
  34.     ((unsigned char *) (addrPtr))[1] = 0x49;            \
  35.     ((unsigned char *) (addrPtr))[6] = 0xfe;            \
  36. }
  37.  
  38. #define Net_UltraAddressGet(addrPtr, groupPtr, unitPtr) {     \
  39.     *(groupPtr) = (((unsigned char *) (addrPtr))[4] << 2) |     \
  40.           (((unsigned char *) (addrPtr))[5] >> 6);     \
  41.     *(unitPtr) = (((unsigned char *) (addrPtr))[5] & 0x3f);     \
  42. }
  43.  
  44.  
  45. /*
  46.  * Definition of an Ultranet address.
  47.  */
  48. typedef struct Net_UltraAddress {
  49.     char        data[8];
  50. } Net_UltraAddress;
  51.  
  52. #define Net_UltraAddrCmp(a,b) \
  53.     (!(((a).data[4] == (b).data[4]) && ((a).data[5] == (b).data[5])))
  54.  
  55. #define Net_UltraAddrCopy(src, dest) ((dest) = (src))
  56.  
  57. /*
  58.  * Ultranet Transport Layer Address Format.  This structure is used in
  59.  * the various request blocks that are sent to the adapter.
  60.  * Here are a few tips on filling this in.  The "addressSize" is 7.
  61.  * TSAP stands for "Transport Service Access Point".  The standard
  62.  * Ultranet software sets the size to 2 and puts the port in the TSAP.
  63.  * You'll have to follow suit if you want to write to a particular port
  64.  * on a Unix machine with an Ultranet.  On Sprite: the "localAddress" field of
  65.  * the header you just set the tsapSize to 2, and zero out the tsap.
  66.  * For the "remoteAddress" you should set the tsapSize to 2, and tsap[0] 
  67.  * and tsap[1] to something either than {0,0} and {0xff, 0xff}.
  68.  * Use the above macros to set the "address" field.
  69.  */
  70.  
  71. #define NET_ULTRA_ADDR_SIZE        7 /* Value for "addressSize". */
  72. #define NET_ULTRA_TSAP_SIZE        4 /* Size of the TSAP. */
  73.  
  74. typedef struct Net_UltraTLAddress {
  75.     unsigned char    addressSize;    /* Size of the address field. */
  76.     unsigned char    tsapSize;    /* NET_ULTRA_TSAP_SIZE */
  77.     unsigned char    tsap[4];    /* The TSAP, whatever that is. */
  78.     Net_UltraAddress    address;    /* The network address. */
  79.     char        pad[2];        /* Pad this out to 16 bytes. */
  80. } Net_UltraTLAddress;
  81.  
  82. /*
  83.  * A "wildcard" transport layer address that matches any address. 
  84.  * This can be used in the "localAddress" field, as well as to initialize
  85.  * Net_UltraTLAddress structures before filling them in.
  86.  */
  87.  
  88. #define Net_UltraTLWildcard(addrPtr) {                \
  89.     bzero((char *) (addrPtr), sizeof(Net_UltraTLAddress));    \
  90.     (addrPtr)->addressSize = 7;                    \
  91.     (addrPtr)->tsapSize = 4;                    \
  92. }
  93.  
  94. /*
  95.  * Header on ultranet packets. If you want to use any of the fields other
  96.  * than the remote and local address you should look at the file
  97.  * "kernel/netUltra.h".  Those fields marked "unused" do not need to be
  98.  * used to send packets to or receive packets from the net device and must
  99.  * be set to zero.  Your best bet is to bzero the header before filling
  100.  * it in.
  101.  */
  102.  
  103. typedef struct Net_UltraHeader {
  104.     unsigned char    cmd;        /* Unused. */
  105.     unsigned char    status;        /* Unused. */
  106.     unsigned short    reference;    /* Unused. */
  107.     int            foo;        /* Unused. */
  108.     Address        buffer;        /* Unused. */
  109.     int            size;        /* Unused. */
  110.     Net_UltraTLAddress    remoteAddress;    /* Address of remote host. */
  111.     Net_UltraTLAddress    localAddress;    /* Address of local host. */
  112.     unsigned short    options;    /* Unused. */
  113.     unsigned short    quality;    /* Unused. */
  114.     unsigned int    pad3;
  115. } Net_UltraHeader;
  116.  
  117. /*
  118.  * Minimum and maximum Ultranet packet sizes (including the Net_UltraHeader).
  119.  */
  120.  
  121. #define NET_ULTRA_MIN_BYTES     0
  122. #define NET_ULTRA_MAX_BYTES     (32768 + sizeof(Net_UltraHeader))
  123.  
  124. #endif /* _NETULTRA */
  125.  
  126.